package com.teamwings.modules.code.service;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.teamwings.modules.code.entity.FormTableCode;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.form.api.vo.FormInfoDetailVO;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author admin
 * @since 2021-05-06
 */
public interface IFormTableCodeService extends IService<FormTableCode> {
    FormTableCode getLatestOneByFormId(String formId);

    List<FormTableCode> getLatestListByFormIds(List<String> formIds);

    // 获取表单结构
    List<Map<String, String>> getColumn(String formId);

    Map<String, String> getTypeMap(String formId, Boolean hasFormId);

    Map<String, String> getCnameMap(String formId);

    FormTableCode getByFormIdAndVersion(String formId, Integer version);

    List<FormTableCode> getAllVersionByHeadId(String headId);

    List<FormTableCode> getCodeWithHead(Wrapper<FormTableCode> wrapper);

    /**
     * 根据多个headid 查询 对应的 table_code
     * @param wrapper
     * @return
     */
    List<String> getTableCodeWithHeads(Wrapper<FormTableCode> wrapper);

    /**
     * 根据 tableHeadId 查询code的全部字段或者指定字段 可以获取最新的code (可以再扩展)
     * @param tableHeadId headid
     * @param isGetLast 是否获取最新的code
     * @param columns 查询指定字段（数据库字段名）
     * @return
     */
    Object getAllOrSpecific(String tableHeadId, Boolean isGetLast, String... columns );

    Map<String, String> getTypeMap(String formId);

    /**
     * 根据 tableCode的List 递归遍历组件
     * @param jsonList tableCode的List
     * @param detailVo 封装类
     * @param fn    查询子表单控件
     * @return
     */
    FormInfoDetailVO getComponentForRecursion(JSONArray jsonList, FormInfoDetailVO detailVo, Function<String, JSONArray> fn);
}
